/**
 * 项目名称: springcloudtest
 * 类名称: TxConfig.java
 * 包名称: com.zw.trans.tx
 * <p>
 * 修改履历:
 * 日期       2019-11-11
 * 修正者     Thomas
 * 主要内容   初版做成
 * <p>
 * Copyright (c) 2016-2019
 */
package com.zw.trans.tx;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

/**
 * 事务配置类
 * 事务传播行为类型	说明
 * propagation_required	如果当前没有事务，就新建一个事务，如果已经存在一个事务中，
 * 加入到这个事务中。这是最常见的选择。
 * propagation_supports	支持当前事务，如果当前没有事务，就以非事务方式执行。
 * propagation_mandatory	使用当前的事务，如果当前没有事务，就抛出异常。
 * propagation_requires_new	新建事务，如果当前存在事务，把当前事务挂起。
 * propagation_not_supported	以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。
 * propagation_never	以非事务方式执行，如果当前存在事务，则抛出异常。
 * propagation_nested	如果当前存在事务，则在嵌套事务内执行。如果当前没有事务，
 * 则执行与propagation_required类似的操作。
 *
 * @Author Thomas 2019-11-11 15:25
 * The world of programs is a wonderful world
 */
@Configuration
@ComponentScan("com.zw.trans.tx")
@EnableTransactionManagement
public class TxConfig {

    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate;
    }

    @Bean
    public DataSourceTransactionManager transactionManager(@Autowired DataSource dataSource) {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
        return transactionManager;
    }


}
